package com.asa.a.code;

public class StringTest {
	
	
	 public static void main(String[] args) {
		
		 StringBuilder s = new StringBuilder(1024);
		 //如果你确定了字符串拼接不会超过构造函数设置的这个值，尽量使用StringBuilder来拼接字符串
		 //这样效率高一些，一部分份是省去了变量字符串与常量字符串拼接，底层不断创建StringBuilder
		 //另一部分原因与CG有关，平凡的创建String是会存到内存中堆中的字符串常量池中，会 增加CG压力的
		 //当然如果考虑到线程安全问题，需要使用StringBuffer替代StringBuilder
		 
		 //常量字符串与常量字符串拼接编译时会优化成一个字符串
		 //变量字符串与变量字符串拼接底层StringBuilder
		//变量字符串与常量字符串拼接底层StringBuilder
		 //final修饰的变量字符串实际上在编译过程中被当做了常量字符串了
		 
		 //StringBuilder是对象，==号对对象的判断是地址应用对比
		 //常量字符串直接就在常量池中了
		 //String对象的话，调用intern方法，就直接和常量池挂钩了
		 
		 
		 
//		 String asa = new String("asa");
//		 
//		 String intern = asa.intern();
		 String asc = new String("a")+new String("sa");
		//这个步骤的现象很特别，之前如果有asa字符串在常量池中，或者asb="asa"这个放到它前面对比都是false，但这样是true
		 //原理是：jdk6中只是把字符串放入到了常量池中；	jdk7以后考虑了空间节省，它直接把地址给asc了，而必须有字符串何必才会触发这个优化，因为
		 //非拼接的，在创建的时候就已经在常量池中创建了，再调用intern方法的时候不会再放入常量池中，也就不存在asc指向地址的重新赋值
		 asc.intern();
		 String asb = "asa";
		 String asd = new String("asa");
//		 System.out.println(asa == intern);
//		 System.out.println(asb == intern);
//		 System.out.println(asa == asb);

		 System.out.println(asb == asc);//jdk6的时候还是false，jdk7以后就是true了
		 System.out.println(asb == asd);
		 
		 
		 try {
			Thread.sleep(1000000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 

	}
	
	
	

}
